Read counts data

Load and counts file

oriCountsFile <- read.table(file = fileCounts)
countsFile <- oriCountsFile
countsFile <- janitor::row_to_names(countsFile, row_number=1)
names(countsFile)[1] <- "miR"
head(countsFile)
countsFile$miR <- str_extract(countsFile$miR, "[^|]+") 
countsFile

Update the IDs

length(unique(countsFile$miR))
[1] 2588

Fetch the mirbase22 IDs and sequences

dim(mrbse)
[1] 2656    2

Merge this with the updated IDs

Merge this with the data

length(mergedData[,"Name"])
[1] 2588

Quintize the data

For each column: assign each miRNA a value 1-5 depending on which of the 20th percentiles it falls into. If the value is 0, it remains a 0

```r
# Given a column, assign a number to each element from 0-5. All
# 0s get a 0, and the rest get a value according to the 20th percentile
# that it falls in among the non-zero values.
quintize <- function(vec) {
  qntls <- c(0, quantile(vec[which(vec != 0)], 0.2*(1:4)))
  vec2 <- sapply(vec, function(x) {
    if (x == 0 || is.na(x)) return(0)
    else return(max(which(x > qntls)))
  })
  return(vec2)
}

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubWVyZ2VkRGF0YVssMzpuY29sKG1lcmdlZERhdGEpXSA9IGxhcHBseShtZXJnZWREYXRhWywzOm5jb2wobWVyZ2VkRGF0YSldLCBGVU4gPSBmdW5jdGlvbih5KXthcy5udW1lcmljKHkpfSlcbnF1aW50aXplZERhdGEgPC0gYXBwbHkobWVyZ2VkRGF0YVssLWMoMToyKV0sIDIsIHF1aW50aXplKVxucXVpbnRpemVkRGF0YSA8LSBjYmluZChtZXJnZWREYXRhWywxOjJdLCBxdWludGl6ZWREYXRhKVxucXVpbnRpemVkRGF0YVsxOjUsMTo1XVxuYGBgXG5gYGAifQ== -->

```r
```r
mergedData[,3:ncol(mergedData)] = lapply(mergedData[,3:ncol(mergedData)], FUN = function(y){as.numeric(y)})
quintizedData <- apply(mergedData[,-c(1:2)], 2, quintize)
quintizedData <- cbind(mergedData[,1:2], quintizedData)
quintizedData[1:5,1:5]

<!-- rnb-source-end -->

<!-- rnb-frame-begin eyJtZXRhZGF0YSI6eyJjbGFzc2VzIjoiZGF0YS5mcmFtZSIsIm5yb3ciOjUsIm5jb2wiOjUsInN1bW1hcnkiOnsiRGVzY3JpcHRpb24iOiJkZiBbNSB4IDVdIn19LCJyZGYiOiJINHNJQUFBQUFBQUFCbzFTVFUrRFFCQ2RVc0NXcEsySkh5Zi9BaHVCTkkyM0VreElQS2lwYnV4MVM5RTJJbFNnMGFPL3ZEb0x1OXB1TVFwczV1MmI5NGFkZ2NubDFMT21GZ0MwUVc5cDBEWVFnaG5jT3U3UUJkQTEzTFZBaHk2UDc2ZzZRc0ExaDFXc0U0TkZ3ZXdrTHUwUnMxM2JXd202dDBVM2tzTjljdGFrbkhIbDdpdFBBeHBTUC9ERElLRDRZS1FVZ2NpZUlNT3pQa1hBbFZWV1dtbm9oMmptVDBoNUdZN3BUK0hhR3RSV0RGajNWeS9lM0F2UTU0Y2JRMzJORDBVOGJ0NS82MVhkWDNwWnY2UG9PNnArNThNWktYdUpDMldDK2pXU0FyZnY0bGNCeis2RDBDYzNFK0lQcnh4eTd2akVjWERqWGp3UXgydlF1UC9RZUh1YTNmTjE4K3lOeURQMmNHa2ZkUmVHMmtpVXNFSTJJa2xyemtwR0huUGVEc0JHc1J4a3EzS1pwV2pTK0s5cmNrT1ZydGQyb1ZhdUVJTjF5azgxdDZQRk9uMjJSNHEzSjZLeGkvbnJ0VTlSeXBUVGpxTkZKckFacDAvTFZNN2VTTmdzVHNTbWo1T29Ca0ZXK1RJdFpZZklGcVRNU2laMVZwUWxrcWw2aHMwWC9YS1BKY29EQUFBPSJ9 -->

<div data-pagedtable="false">
  <script data-pagedtable-source type="application/json">
{"columns":[{"label":[""],"name":["_rn_"],"type":[""],"align":["left"]},{"label":["Name"],"name":[1],"type":["chr"],"align":["left"]},{"label":["Seq"],"name":[2],"type":["chr"],"align":["left"]},{"label":["TCGA.OR.A5J1.01A.11R.A29W.13"],"name":[3],"type":["dbl"],"align":["right"]},{"label":["TCGA.OR.A5J2.01A.11R.A29W.13"],"name":[4],"type":["dbl"],"align":["right"]},{"label":["TCGA.OR.A5J3.01A.11R.A29W.13"],"name":[5],"type":["dbl"],"align":["right"]}],"data":[{"1":"hsa-let-7a-2-3p","2":"CUGUACAGCCUCCUAGCUUUCC","3":"2","4":"4","5":"2","_rn_":"1"},{"1":"hsa-let-7a-3p","2":"CUAUACAAUCUACUGUCUUUC","3":"4","4":"5","5":"3","_rn_":"2"},{"1":"hsa-let-7a-5p","2":"UGAGGUAGUAGGUUGUAUAGUU","3":"5","4":"5","5":"5","_rn_":"3"},{"1":"hsa-let-7b-3p","2":"CUAUACAACCUACUGCCUUCCC","3":"4","4":"4","5":"3","_rn_":"4"},{"1":"hsa-let-7b-5p","2":"UGAGGUAGUAGGUUGUGUGGUU","3":"5","4":"5","5":"5","_rn_":"5"}],"options":{"columns":{"min":{},"max":[10],"total":[5]},"rows":{"min":[10],"max":[10],"total":[5]},"pages":{}}}
  </script>
</div>

<!-- rnb-frame-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



### Combine the replicates

Get the sample mapping file


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubWFwcGluZyA8LSByZWFkLnRhYmxlKFxcLi9TYW1wbGVzX21hcHBlZC50eHRcXClcbm1hcHBpbmcgPC0gamFuaXRvcjo6cm93X3RvX25hbWVzKG1hcHBpbmcsIHJvd19udW1iZXI9MSlcblxuXG4jYW5ub3RhdGlvbiA8LSByZWFkLnRhYmxlKFxcLi9taWNyb1JOQV9zYW1wbGVzLnR4dFxcKVxuI2Fubm90YXRpb24gPC0gamFuaXRvcjo6cm93X3RvX25hbWVzKGFubm90YXRpb24sIHJvd19udW1iZXI9MSlcbiNuYW1lcyhhbm5vdGF0aW9uKVsyXSA8LSBcXERpc2Vhc2VcXFxuI3NhbXBsZU1ldGEgPC0gcmVhZC50YWJsZShcXHJpZ291dHNvc19zYW1wbGVJbmZvLnR4dFxcLCBoZWFkZXIgPSBULCBzZXAgPSBcXFxcdFxcKVxuI21ldGEgPC0gcmVhZC50YWJsZShcXG1ldGEudHh0XFwsIGhlYWRlciA9IFQsIHNlcCA9IFxcXFx0XFwpXG4jbWV0YSRwYXRpZW50LnByaW1hcnlfcGF0aG9sb2d5LnR1bW9yX3Rpc3N1ZV9zaXRlXG5cbiMgQ3JlYXRlIHNhbXBsZSAtIHRpc3N1ZSBtYXBwaW5nXG4jbWFwcGluZyA8LSBzYW1wbGVNZXRhWyxuYW1lcyhzYW1wbGVNZXRhKSAlaW4lIGMoXFxTYW1wbGVcXCxcXHRpc3N1ZV9vcl9vcmdhbl9vZl9vcmlnaW5cXCldXG4jbmFtZXMobWFwcGluZylbMl0gPC0gXFxUaXNzdWVcXFxuI21hcHBpbmckU2FtcGxlIDwtIGNoYXJ0cignLScsICcuJywgbWFwcGluZyRTYW1wbGUpICMgcmVwbGFjZSAnLScgd2l0aCAnLicgaW4gU2FtcGxlXG5cblxuIyBBZGQgdGlzc3VlIGluZm8gdG8gYW5ub3RhdGlvbiwgYmFzZWQgb24gc2FtcGxlLXRpc3N1ZSBtYXBwaW5nXG4jYW5ub3RhdGlvbiRUaXNzdWUgPC0gbWFwcGluZyRUaXNzdWVbbWF0Y2goYW5ub3RhdGlvbiRTYW1wbGUsIG1hcHBpbmckU2FtcGxlKV1cblxuI1NhbXBsZSA8LSBhbm5vdGF0aW9uJFNhbXBsZVxuI21pc3NpbmdUaXNzdWUgPC0gU2FtcGxlW3doaWNoKGlzLm5hKGFubm90YXRpb24kVGlzc3VlKSldXG4jbWlzc2luZ1Rpc3N1ZVxuXG5gYGBcbmBgYCJ9 -->

```r
```r
mapping <- read.table(\./Samples_mapped.txt\)
mapping <- janitor::row_to_names(mapping, row_number=1)


#annotation <- read.table(\./microRNA_samples.txt\)
#annotation <- janitor::row_to_names(annotation, row_number=1)
#names(annotation)[2] <- \Disease\
#sampleMeta <- read.table(\rigoutsos_sampleInfo.txt\, header = T, sep = \\t\)
#meta <- read.table(\meta.txt\, header = T, sep = \\t\)
#meta$patient.primary_pathology.tumor_tissue_site

# Create sample - tissue mapping
#mapping <- sampleMeta[,names(sampleMeta) %in% c(\Sample\,\tissue_or_organ_of_origin\)]
#names(mapping)[2] <- \Tissue\
#mapping$Sample <- chartr('-', '.', mapping$Sample) # replace '-' with '.' in Sample


# Add tissue info to annotation, based on sample-tissue mapping
#annotation$Tissue <- mapping$Tissue[match(annotation$Sample, mapping$Sample)]

#Sample <- annotation$Sample
#missingTissue <- Sample[which(is.na(annotation$Tissue))]
#missingTissue

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



Create Disease, Tissue, and Group (Tissue_Disease) columns


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxubWFwcGluZyRUaXNzdWUgPC0gc3RyX3JlcGxhY2VfYWxsKG1hcHBpbmckdHVtb3JfdGlzc3VlX3NpdGUsIFxcIFxcLCBcXC5cXClcbm1hcHBpbmckVGlzc3VlIDwtIHRvbG93ZXIobWFwcGluZyRUaXNzdWUpXG4jbWFwcGluZyRHcm91cCA8LSBhcHBseShtYXBwaW5nWyxjKG5jb2wobWFwcGluZyktMSxuY29sKG1hcHBpbmcpKV0sIDEsIGZ1bmN0aW9uKHgpIHBhc3RlKHhbMV0sIHhbMl0sIHNlcD1cXF9cXCkpXG5tYXBwaW5nJEdyb3VwIDwtIGFwcGx5KG1hcHBpbmdbLGMoNSwyKV0sIDEsIGZ1bmN0aW9uKHgpIHBhc3RlKHhbMV0sIHhbMl0sIHNlcD1cXF9cXCkpXG5oZWFkKG1hcHBpbmcpXG5gYGBcbmBgYCJ9 -->

```r
```r
mapping$Tissue <- str_replace_all(mapping$tumor_tissue_site, \ \, \.\)
mapping$Tissue <- tolower(mapping$Tissue)
#mapping$Group <- apply(mapping[,c(ncol(mapping)-1,ncol(mapping))], 1, function(x) paste(x[1], x[2], sep=\_\))
mapping$Group <- apply(mapping[,c(5,2)], 1, function(x) paste(x[1], x[2], sep=\_\))
head(mapping)

<!-- rnb-source-end -->

<!-- rnb-frame-begin eyJtZXRhZGF0YSI6eyJjbGFzc2VzIjoiZGF0YS5mcmFtZSIsIm5yb3ciOjYsIm5jb2wiOjYsInN1bW1hcnkiOnsiRGVzY3JpcHRpb24iOiJkZiBbNiB4IDZdIn19LCJyZGYiOiJINHNJQUFBQUFBQUFCcjFUMzB2RE1CRE91bCtzT3BuczFYOWh3YlRyd01mU3dkQVhaUTdjVzRscjFHS1hsQ1JGLy9yTnRFdm1XdnBRUkgwSXlYMzMzZDEzbDJRNVg3djIyZ1lBdEVHblpZRjJWeDFCTDNoQWp1Y0EwTEdVMVFJZE1NajNUOFVhNTI2MVJzVitjSnl2Z29VUDc1ZlE5KzVRRGViVVlHNE5OcTNCdkJwc1ZxbmY5b1BncDhkeXBxdlRUdUExOGlGQ3luQnVuaUJ5YXpoT0E0N2JnRE50d1BFYWNHWUZ4ejNobFB2cjQ0Z1RpcFBmTlArN3dwbUd3KytiL0RPby9BRzZGRytKcU1nWkJDd2lZWDRIUnZZOEZnUUxZdnlQZUpzbUpMeWRhK0JTWmx2R1F4a0xrWkZReE5Jd2U2c0NNc1VXbkdWcFJjR0FzdzlvVkF6MVY3U0szNnVZZVpURytsWHBtd1FMSTkyQWRvUWxoaTljNVZQV3JoTFNaNm1NR1ZWQjFsaG5QZzF1OFFvd3ltaXVMSnBzM2pMNlBuRlJYcUh3SDlaUTc3M3lPYTlwN1hXdXJoa0ZvYTh4UFk0aXdjL0V2SW9MTllKaUFqRGxNWldtRllVS0tKazh2aDU3d3hLREZNMkIzUmMyMitwaTdRUUFBQT09In0= -->

<div data-pagedtable="false">
  <script data-pagedtable-source type="application/json">
{"columns":[{"label":[""],"name":["_rn_"],"type":[""],"align":["left"]},{"label":["Code_TCGA"],"name":[1],"type":["chr"],"align":["left"]},{"label":["Disease"],"name":[2],"type":["chr"],"align":["left"]},{"label":["Sample_ID"],"name":[3],"type":["chr"],"align":["left"]},{"label":["tumor_tissue_site"],"name":[4],"type":["chr"],"align":["left"]},{"label":["Tissue"],"name":[5],"type":["chr"],"align":["left"]},{"label":["Group"],"name":[6],"type":["chr"],"align":["left"]}],"data":[{"1":"TCGA.OR.A5J1","2":"ACC","3":"TCGA.OR.A5J1.01A.11R.A29W.13","4":"adrenal","5":"adrenal","6":"adrenal_ACC","_rn_":"2"},{"1":"TCGA.OR.A5J2","2":"ACC","3":"TCGA.OR.A5J2.01A.11R.A29W.13","4":"adrenal","5":"adrenal","6":"adrenal_ACC","_rn_":"3"},{"1":"TCGA.OR.A5J3","2":"ACC","3":"TCGA.OR.A5J3.01A.11R.A29W.13","4":"adrenal","5":"adrenal","6":"adrenal_ACC","_rn_":"4"},{"1":"TCGA.OR.A5J4","2":"ACC","3":"TCGA.OR.A5J4.01A.11R.A29W.13","4":"adrenal","5":"adrenal","6":"adrenal_ACC","_rn_":"5"},{"1":"TCGA.OR.A5J5","2":"ACC","3":"TCGA.OR.A5J5.01A.11R.A29W.13","4":"adrenal","5":"adrenal","6":"adrenal_ACC","_rn_":"6"},{"1":"TCGA.OR.A5J6","2":"ACC","3":"TCGA.OR.A5J6.01A.31R.A29W.13","4":"adrenal","5":"adrenal","6":"adrenal_ACC","_rn_":"7"}],"options":{"columns":{"min":{},"max":[10],"total":[6]},"rows":{"min":[10],"max":[10],"total":[6]},"pages":{}}}
  </script>
</div>

<!-- rnb-frame-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



Grouping: Combine replicates (samples that have the same type)


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuc2lkIDwtIHNvcnQobWFwcGluZyRTYW1wbGVfSURbIW1hcFRydWVdKVxuXG5gYGAifQ== -->

```r
sid <- sort(mapping$Sample_ID[!mapTrue])
Error in sort(mapping$Sample_ID[!mapTrue]) : object 'mapping' not found

Ensure the terms are standardized

Ensure that all the group names appear in the ontology or the corrections file.

Get the ontology and correction files

```r
ont <- read.table(\C:/Users/gitta/Documents/MirDIP_counts/ontology.txt\, header = F, sep = \\t\)
corr <- read.table(\C:/Users/gitta/Documents/MirDIP_counts/corrections.txt\, header = T, sep = \\t\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


Aim to have 0 as a result, meaning all terms are either already in the ontology or the correction file. Or else: update correction file or ontology file, or both.


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudHJtcyA8LSB1bmlxdWUodW5saXN0KHN0cnNwbGl0KG5hbWVzKGNvbWJpbmVkRGF0YSlbMzpuY29sKGNvbWJpbmVkRGF0YSldLCBcXF9cXCkpKSAjIFNwbGl0cyB0aGUgY29tcG9zaXRlIHRlcm1zIHRoYXQgY29udGFpbiBib3RoIHRpc3N1ZStkaXNlYXNlXG5pZiAobGVuZ3RoKHdoaWNoKHRybXMgJWluJSB1bmlvbihjb3JyWywxXSwgdW5pcXVlKHVubGlzdChvbnRbLGMoMSwzKV0pKSkpKSAhPSAwKXtcbiAgdHJtc1std2hpY2godHJtcyAlaW4lIHVuaW9uKGNvcnJbLDFdLCB1bmlxdWUodW5saXN0KG9udFssYygxLDMpXSkpKSldICMgV2hpY2ggdGVybXMgYXJlbid0IGluIHRoZSBvbnRvbG9neSBvciB0aGUgY29ycmVjdGVkIHRlcm1zXG59IGVsc2Uge1xuICB0cm1zXG59XG5gYGBcbmBgYCJ9 -->

```r
```r
trms <- unique(unlist(strsplit(names(combinedData)[3:ncol(combinedData)], \_\))) # Splits the composite terms that contain both tissue+disease
if (length(which(trms %in% union(corr[,1], unique(unlist(ont[,c(1,3)]))))) != 0){
  trms[-which(trms %in% union(corr[,1], unique(unlist(ont[,c(1,3)]))))] # Which terms aren't in the ontology or the corrected terms
} else {
  trms
}

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoiY2hhcmFjdGVyKDApXG4ifQ== -->

character(0)




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

Correct current terms that need to be corrected.

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuY29sbmFtZXMoY29tYmluZWREYXRhKSA8LSBzYXBwbHkoY29sbmFtZXMoY29tYmluZWREYXRhKSwgZnVuY3Rpb24oeikge1xuICB5IDwtIHN0cnNwbGl0KHosIFwiX1wiKVtbMV1dXG4gIHJldFZhbCA8LSBzYXBwbHkoeSwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ICVpbiUgY29yciRjdXJyZW50VGVybSkge1xuICAgICAgcmV0dXJuKGNvcnIkY29ycmVjdGVkVGVybVttYXRjaCh4LCBjb3JyJGN1cnJlbnRUZXJtKV0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybih4KVxuICAgIH1cbiAgfSlcbiAgcmV0dXJuKHBhc3RlKHJldFZhbCwgY29sbGFwc2UgPSBcIl9cIikpXG59KVxuXG5gYGAifQ== -->

```r
colnames(combinedData) <- sapply(colnames(combinedData), function(z) {
  y <- strsplit(z, "_")[[1]]
  retVal <- sapply(y, function(x) {
    if (x %in% corr$currentTerm) {
      return(corr$correctedTerm[match(x, corr$currentTerm)])
    } else {
      return(x)
    }
  })
  return(paste(retVal, collapse = "_"))
})
Error in is.data.frame(x) : object 'combinedData' not found

Convert to long format

Add the Canonical column and Source column

```r
data <- combinedData # all tissues have to exist in ontology or correction files
data$Canonical <- sapply(data$Seq, function(x) if (x %in% mrbse$Seq) return(T) else return(F))
data$Source <- \Francisco*\
head(data)
data <- data[,c(1,2,ncol(data)-1,ncol(data),3:(ncol(data)-2))] # Set columns alignment
#head(data)

<!-- rnb-source-end -->

<!-- rnb-frame-begin eyJtZXRhZGF0YSI6eyJjbGFzc2VzIjoiZGF0YS5mcmFtZSIsIm5yb3ciOjYsIm5jb2wiOjYsInN1bW1hcnkiOnsiRGVzY3JpcHRpb24iOiJkZiBbNiB4IDZdIn19LCJyZGYiOiJINHNJQUFBQUFBQUFCclZUejAvYk1CUjIwMUxXU0VWSWpOMjQ3VEJOU2lSK2lSTUtrZEVzTHRNMFpJbkRKT1M2aGtha2RuSFNnZURDZjRDMGYyR2NkNXIyQit5ZjRNQ0pNK2ROMjRYdHViVUxkY3VSeE5aNy90NzdYcjU4U2o1dTc2MkdleUZDcUlwcWxRQlZaeUJGZGZ4aGVXVjlCYUZhQUtjS3FxR0dpYWZRdFdES3NPY0hjVmhvZGdvVzVhS01ObGkwMnBzQ3JrK0NyV21kcldtZGZCcllOdlJ4Rll1WXBqVEZhVW9od1pSQW9CVGI0aXRLVWtKb2FoYWhVRXhOVGwzVlVmR1FDb0ZpL0NRWDdrZmN5Y2xrWWpJeGs0bWRETUtnTW1la0oxZG50K1RieS9PdEYxK3Z3ODNlMWVnOEN5ZUFraisvZmw1K2V2TTcrVDdFSFEvWksvbjcrc3NPTFArYzNIVi8zTUJDRDFkb2VaVW45bU1ydzNlYVNaNFZYTDE5Um1UODY1cVJyQ3NLVDBqdFBZQTJyKzZLWTVzdTVkbG5vZmNQc3BaV09YVGtPZE14WjVwblVuV1pHemhvc29jR1psTEpqTFBjQXZWZDFkZGNlQ0lhV3AzRVRrZ1RkbkF4ZEsvdXErVTVLNXhhQjRadFZyTDRRQnZOQ04xN2xGblZLek1sZ1JTNG55ajAvQi85YWRvRDV2dlNxR3BIdk5PWFI5SHlta2R1MmxnZno4M3pnMysrcDRKM2xITkJ5TU5NaXBGanJDV2NRWE5neGNDSnVLY3pXYnBYQkxTSVMxV09qQXk1eWgweWVHbDAveDlGOERIcFZRUUFBQT09In0= -->

<div data-pagedtable="false">
  <script data-pagedtable-source type="application/json">
{"columns":[{"label":[""],"name":["_rn_"],"type":[""],"align":["left"]},{"label":["Name"],"name":[1],"type":["chr"],"align":["left"]},{"label":["Seq"],"name":[2],"type":["chr"],"align":["left"]},{"label":["liver_fibrolamellar.carcinoma"],"name":[3],"type":["dbl"],"align":["right"]},{"label":["liver"],"name":[4],"type":["dbl"],"align":["right"]},{"label":["Canonical"],"name":[5],"type":["lgl"],"align":["right"]},{"label":["Source"],"name":[6],"type":["chr"],"align":["left"]}],"data":[{"1":"hsa-let-7a-3p","2":"CUAUACAAUCUACUGUCUUUC","3":"0.04","4":"0.0000000","5":"TRUE","6":"Francisco*","_rn_":"1"},{"1":"hsa-let-7a-5p","2":"UGAGGUAGUAGGUUGUAUAGUU","3":"3.08","4":"1.5714286","5":"TRUE","6":"Francisco*","_rn_":"2"},{"1":"hsa-let-7b-3p","2":"CUAUACAACCUACUGCCUUCCC","3":"0.04","4":"0.0000000","5":"TRUE","6":"Francisco*","_rn_":"3"},{"1":"hsa-let-7b-5p","2":"UGAGGUAGUAGGUUGUGUGGUU","3":"2.88","4":"1.5714286","5":"TRUE","6":"Francisco*","_rn_":"4"},{"1":"hsa-let-7c-5p","2":"UGAGGUAGUAGGUUGUAUGGUU","3":"1.56","4":"0.8571429","5":"TRUE","6":"Francisco*","_rn_":"5"},{"1":"hsa-let-7d-3p","2":"CUAUACGACCUGCUGCCUUUCU","3":"0.08","4":"0.0000000","5":"TRUE","6":"Francisco*","_rn_":"6"}],"options":{"columns":{"min":{},"max":[10],"total":[6]},"rows":{"min":[10],"max":[10],"total":[6]},"pages":{}}}
  </script>
</div>

<!-- rnb-frame-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



Convert to long format


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZGF0YV9sb25nIDwtIG1lbHQoZGF0YSwgaWQudmFycz1jKFxcTmFtZVxcLCBcXFNlcVxcLCBcXENhbm9uaWNhbFxcLCBcXFNvdXJjZVxcKSlcbmBgYFxuYGBgIn0= -->

```r
```r
data_long <- melt(data, id.vars=c(\Name\, \Seq\, \Canonical\, \Source\))

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


Binarization

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZGF0YV9sb25nJEJpbmFyeSA8LSBzYXBwbHkoZGF0YV9sb25nJHZhbHVlLCBmdW5jdGlvbih4KSBpZiAoeCA9PSAwKSByZXR1cm4oMCkgZWxzZSByZXR1cm4oMSkpXG5uYW1lcyhkYXRhX2xvbmcpIDwtIGMoXFxtaVJcXCwgXFxTZXFcXCwgXFxDYW5vbmljYWxcXCwgXFxTb3VyY2VcXCwgXFxUaXNzdWVcXCwgXFxTY2FsZVxcLCBcXEJpbmFyeVxcKVxuYGBgXG5gYGAifQ== -->

```r
```r
data_long$Binary <- sapply(data_long$value, function(x) if (x == 0) return(0) else return(1))
names(data_long) <- c(\miR\, \Seq\, \Canonical\, \Source\, \Tissue\, \Scale\, \Binary\)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



### Write to file


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxud3JpdGUudGFibGUoZGF0YV9sb25nLCBcXC4vZnJhbmNpc2NvX2xvbmdEYXRhLnR4dFxcLCBzZXAgPSBcXFxcdFxcLCByb3cubmFtZXMgPSBGLCBjb2wubmFtZXMgPSBULCBxdW90ZSA9IEYpXG53cml0ZS50YWJsZSh1bmlxdWUoZGF0YV9sb25nWywxOjNdKSwgXFwuL2ZyYW5jaXNjb19taVJOQXMudHh0XFwsIHNlcCA9IFxcXFx0XFwsIHJvdy5uYW1lcyA9IEYsIGNvbC5uYW1lcyA9IFQsIHF1b3RlID0gRilcbndyaXRlTGluZXMoYXMuY2hhcmFjdGVyKHVuaXF1ZShkYXRhX2xvbmckVGlzc3VlKSksIFxcLi9mcmFuY2lzY29fdGlzc3Vlcy50eHRcXClcbmBgYFxuYGBgIn0= -->

```r
```r
write.table(data_long, \./francisco_longData.txt\, sep = \\t\, row.names = F, col.names = T, quote = F)
write.table(unique(data_long[,1:3]), \./francisco_miRNAs.txt\, sep = \\t\, row.names = F, col.names = T, quote = F)
writeLines(as.character(unique(data_long$Tissue)), \./francisco_tissues.txt\)

```

LS0tCnRpdGxlOiAiUHJvY2Vzc2luZyBUQ0dBIGV4cHJlc3Npb24gZGF0YSIKYXV0aG9yOiAiR2l0dGEgRWthcHV0ZXJpLCBBbm5lLUNocmlzdGluIEhhdXNjaGlsZCIKZGF0ZTogIjI5LzA4LzIwMjIiIApvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KG1pUkJhc2VDb252ZXJ0ZXIpCmxpYnJhcnkocmVzaGFwZTIpCgojIyMjIFVzZWQgRmlsZXM6IApmaWxlQ291bnRzPC0nLi9taWNyb1JOQV9UQ0dBX3ByZXByb2Nlc3NlZC50eHQnCmZpbGVNZXRhRGF0YTwtIi4vU2FtcGxlc19tYXBwZWRfbWljcm9STkFzLnR4dCIKZmlsZU9udG9sb2d5PC0iLi4vb250b2xvZ3kyLnR4dCIKZmlsZUNvcnJlY3Rpb25zPC0iLi4vY29ycmVjdGlvbnMudHh0IgpmaWxlUmVtVGlzc3VlczwtIi4uL3JlbW92ZVRpc3N1ZXMudHh0IgpgYGAKCiMjIyBSZWFkIGNvdW50cyBkYXRhCgpMb2FkIGFuZCBjb3VudHMgZmlsZQpgYGB7cn0Kb3JpQ291bnRzRmlsZSA8LSByZWFkLnRhYmxlKGZpbGUgPSBmaWxlQ291bnRzKQpjb3VudHNGaWxlIDwtIG9yaUNvdW50c0ZpbGUKY291bnRzRmlsZSA8LSBqYW5pdG9yOjpyb3dfdG9fbmFtZXMoY291bnRzRmlsZSwgcm93X251bWJlcj0xKQpuYW1lcyhjb3VudHNGaWxlKVsxXSA8LSAibWlSIgpoZWFkKGNvdW50c0ZpbGUpCmNvdW50c0ZpbGUkbWlSIDwtIHN0cl9leHRyYWN0KGNvdW50c0ZpbGUkbWlSLCAiW158XSsiKSAKY291bnRzRmlsZQpgYGAKCiMjIyBVcGRhdGUgdGhlIElEcyAKCmBgYHtyfQp1cGRhdGUgPC0gbWlSTkFWZXJzaW9uQ29udmVydChjb3VudHNGaWxlJG1pUikKaGVhZCh1cGRhdGUpCmxlbmd0aCh1bmlxdWUoY291bnRzRmlsZSRtaVIpKQpsZW5ndGgodW5pcXVlKHVwZGF0ZVssIk9yaWdpbmFsTmFtZSJdKSkKbGVuZ3RoKHVuaXF1ZSh1cGRhdGVbLCJUYXJnZXROYW1lIl0pKQoKYGBgCgpGZXRjaCB0aGUgbWlyYmFzZTIyIElEcyBhbmQgc2VxdWVuY2VzCgpgYGB7cn0KbXJic2UgPC0gcmVhZC50YWJsZSgiLi4vbWF0dXJlX2hvbW8tc2FwaWVuc19kYXRhZnJhbWUudHh0IiwgaGVhZGVyID0gVCwgc2VwID0gIlx0IikKbXJic2UgPC0gbXJic2VbLWMoMSwyKSxdICMgUmVtb3ZlIHRoZSBmaXJzdCB0d28gcm93cyB0aGF0IGRvbid0IG1hdGNoIHVwIHdpdGggbWlyYmFzZSBhbmQgYXJlIHRoZSBvbmx5IGR1cGxpY2F0ZXMsIGFuZCBhcmUgdGhlIG9ubHkgc2VxdWVuY2VzIHdpdGggVCdzIGZvciBzb21lIHJlYXNvbi4KZGltKG1yYnNlKQpoZWFkKG1yYnNlKQpgYGAKCk1lcmdlIHRoaXMgd2l0aCB0aGUgdXBkYXRlZCBJRHMKCmBgYHtyfQptcmJzZTIgPC0gbWVyZ2UobXJic2UsIHVwZGF0ZSwgYnkueCA9IDEsIGJ5LnkgPSAyLCBhbGwueCA9IEYsIGFsbC55ID0gVCkKbXJic2UyIDwtIG1yYnNlMlssLTRdCmRpbShtcmJzZTIpCmhlYWQobXJic2UyKQpgYGAKCgpNZXJnZSB0aGlzIHdpdGggdGhlIGRhdGEKCmBgYHtyfQptZXJnZWREYXRhIDwtIG1lcmdlKG1yYnNlMiwgY291bnRzRmlsZSwgYnkueCA9IDMsIGJ5LnkgPSAxLCBhbGwueCA9IFQsIGFsbC55ID0gRikKbWVyZ2VkRGF0YSA8LSBtZXJnZWREYXRhWywtMV0gIyBSZW1vdmUgdGhlIG9yaWdpbmFsIChvbGQpIElEcwptZXJnZWREYXRhWzE6NSwxOjVdCmRpbShtZXJnZWREYXRhKQpoZWFkKG1lcmdlZERhdGEpCmxlbmd0aChtZXJnZWREYXRhWywiTmFtZSJdKQpgYGAKCgojIyMgUXVpbnRpemUgdGhlIGRhdGEKCkZvciBlYWNoIGNvbHVtbjogYXNzaWduIGVhY2ggbWlSTkEgYSB2YWx1ZSAxLTUgZGVwZW5kaW5nIG9uIHdoaWNoIG9mIHRoZSAyMHRoIHBlcmNlbnRpbGVzIGl0IGZhbGxzIGludG8uIElmIHRoZSB2YWx1ZSBpcyAwLCBpdCByZW1haW5zIGEgMAoKYGBge3J9CiMgR2l2ZW4gYSBjb2x1bW4sIGFzc2lnbiBhIG51bWJlciB0byBlYWNoIGVsZW1lbnQgZnJvbSAwLTUuIEFsbAojIDBzIGdldCBhIDAsIGFuZCB0aGUgcmVzdCBnZXQgYSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIDIwdGggcGVyY2VudGlsZQojIHRoYXQgaXQgZmFsbHMgaW4gYW1vbmcgdGhlIG5vbi16ZXJvIHZhbHVlcy4KcXVpbnRpemUgPC0gZnVuY3Rpb24odmVjKSB7CiAgcW50bHMgPC0gYygwLCBxdWFudGlsZSh2ZWNbd2hpY2godmVjICE9IDApXSwgMC4yKigxOjQpKSkKICB2ZWMyIDwtIHNhcHBseSh2ZWMsIGZ1bmN0aW9uKHgpIHsKICAgIGlmICh4ID09IDAgfHwgaXMubmEoeCkpIHJldHVybigwKQogICAgZWxzZSByZXR1cm4obWF4KHdoaWNoKHggPiBxbnRscykpKQogIH0pCiAgcmV0dXJuKHZlYzIpCn0KYGBgCgpgYGB7cn0KbWVyZ2VkRGF0YVssMzpuY29sKG1lcmdlZERhdGEpXSA9IGxhcHBseShtZXJnZWREYXRhWywzOm5jb2wobWVyZ2VkRGF0YSldLCBGVU4gPSBmdW5jdGlvbih5KXthcy5udW1lcmljKHkpfSkKcXVpbnRpemVkRGF0YSA8LSBhcHBseShtZXJnZWREYXRhWywtYygxOjIpXSwgMiwgcXVpbnRpemUpCnF1aW50aXplZERhdGEgPC0gY2JpbmQobWVyZ2VkRGF0YVssMToyXSwgcXVpbnRpemVkRGF0YSkKcXVpbnRpemVkRGF0YVsxOjUsMTo1XQpgYGAKCgojIyMgQ29tYmluZSB0aGUgcmVwbGljYXRlcwoKR2V0IHRoZSBzYW1wbGUgbWFwcGluZyBmaWxlCgpgYGB7cn0KbWFwcGluZyA8LSByZWFkLnRhYmxlKGZpbGVNZXRhRGF0YSkKbWFwcGluZyA8LSBqYW5pdG9yOjpyb3dfdG9fbmFtZXMobWFwcGluZywgcm93X251bWJlcj0xKQpoZWFkKG1hcHBpbmcpCgojYW5ub3RhdGlvbiA8LSByZWFkLnRhYmxlKCIuL21pY3JvUk5BX3NhbXBsZXMudHh0IikKI2Fubm90YXRpb24gPC0gamFuaXRvcjo6cm93X3RvX25hbWVzKGFubm90YXRpb24sIHJvd19udW1iZXI9MSkKI25hbWVzKGFubm90YXRpb24pWzJdIDwtICJEaXNlYXNlIgojc2FtcGxlTWV0YSA8LSByZWFkLnRhYmxlKCJyaWdvdXRzb3Nfc2FtcGxlSW5mby50eHQiLCBoZWFkZXIgPSBULCBzZXAgPSAiXHQiKQojbWV0YSA8LSByZWFkLnRhYmxlKCJtZXRhLnR4dCIsIGhlYWRlciA9IFQsIHNlcCA9ICJcdCIpCiNtZXRhJHBhdGllbnQucHJpbWFyeV9wYXRob2xvZ3kudHVtb3JfdGlzc3VlX3NpdGUKCiMgQ3JlYXRlIHNhbXBsZSAtIHRpc3N1ZSBtYXBwaW5nCiNtYXBwaW5nIDwtIHNhbXBsZU1ldGFbLG5hbWVzKHNhbXBsZU1ldGEpICVpbiUgYygiU2FtcGxlIiwidGlzc3VlX29yX29yZ2FuX29mX29yaWdpbiIpXQojbmFtZXMobWFwcGluZylbMl0gPC0gIlRpc3N1ZSIKI21hcHBpbmckU2FtcGxlIDwtIGNoYXJ0cignLScsICcuJywgbWFwcGluZyRTYW1wbGUpICMgcmVwbGFjZSAnLScgd2l0aCAnLicgaW4gU2FtcGxlCgoKIyBBZGQgdGlzc3VlIGluZm8gdG8gYW5ub3RhdGlvbiwgYmFzZWQgb24gc2FtcGxlLXRpc3N1ZSBtYXBwaW5nCiNhbm5vdGF0aW9uJFRpc3N1ZSA8LSBtYXBwaW5nJFRpc3N1ZVttYXRjaChhbm5vdGF0aW9uJFNhbXBsZSwgbWFwcGluZyRTYW1wbGUpXQoKI1NhbXBsZSA8LSBhbm5vdGF0aW9uJFNhbXBsZQojbWlzc2luZ1Rpc3N1ZSA8LSBTYW1wbGVbd2hpY2goaXMubmEoYW5ub3RhdGlvbiRUaXNzdWUpKV0KI21pc3NpbmdUaXNzdWUKCmBgYAoKCkNyZWF0ZSBEaXNlYXNlLCBUaXNzdWUsIGFuZCBHcm91cCAoVGlzc3VlX0Rpc2Vhc2UpIGNvbHVtbnMKCmBgYHtyfQptYXBwaW5nJFRpc3N1ZSA8LSBzdHJfcmVwbGFjZV9hbGwobWFwcGluZyR0dW1vcl90aXNzdWVfc2l0ZSwgIiAiLCAiLiIpCmhlYWQobWFwcGluZykKbWFwcGluZyRUaXNzdWUgPC0gdG9sb3dlcihtYXBwaW5nJFRpc3N1ZSkKaGVhZChtYXBwaW5nKQptYXBwaW5nJEdyb3VwIDwtIGFwcGx5KG1hcHBpbmdbLGMoNSwyKV0sIDEsIGZ1bmN0aW9uKHgpIHBhc3RlKHhbMV0sIHhbMl0sIHNlcD0iXyIpKQpoZWFkKG1hcHBpbmcpCmBgYAoKCkdyb3VwaW5nOiBDb21iaW5lIHJlcGxpY2F0ZXMgKHNhbXBsZXMgdGhhdCBoYXZlIHRoZSBzYW1lIHR5cGUpCgpgYGB7cn0KdW5pcXVlVGlzc3VlcyA8LSB1bmlxdWUobWFwcGluZyRHcm91cCkKcXVpbnRpemVkRGF0YTIgPC0gcXVpbnRpemVkRGF0YQpoZWFkKHF1aW50aXplZERhdGEyWywxOjEwXSkKZGltKHF1aW50aXplZERhdGEyKQpkaW0obWFwcGluZykKbWFwVHJ1ZTwtIG1hcHBpbmckU2FtcGxlX0lEICVpbiUgbmFtZXMocXVpbnRpemVkRGF0YTIpCmxlbmd0aChtYXBUcnVlKQpzdW0obWFwVHJ1ZSkKCiN0ZXN0IDwtIHF1aW50aXplZERhdGEyWywobmFtZXMocXVpbnRpemVkRGF0YTIpICVpbiUgbWFwcGluZyRTYW1wbGVfSUQpXQojdGVzdDIgPC0gbGFwcGx5KHVuaXF1ZVRpc3N1ZXMsIGZ1bmN0aW9uKHgpIHsKIyAgZGYgPC0gYXMuZGF0YS5mcmFtZSh0ZXN0WyxtYXBwaW5nJFNhbXBsZV9JRFt3aGljaChtYXBwaW5nJEdyb3VwID09IHgpXV0pCiMgIHJldHVybihyb3dNZWFucyhkZikpCiN9KQoKCmNvbWJpbmVkRGF0YSA8LSBsYXBwbHkodW5pcXVlVGlzc3VlcywgZnVuY3Rpb24oeCkgewogIGRmIDwtIGFzLmRhdGEuZnJhbWUocXVpbnRpemVkRGF0YTJbLG1hcHBpbmckU2FtcGxlX0lEW3doaWNoKG1hcHBpbmckR3JvdXAgPT0geCldXSkKICByZXR1cm4ocm93TWVhbnMoZGYpKQp9KQoKbmFtZXMoY29tYmluZWREYXRhKSA8LSB1bmlxdWVUaXNzdWVzCmNvbWJpbmVkRGF0YSA8LSBkby5jYWxsKGNiaW5kLCBjb21iaW5lZERhdGEpCmNvbWJpbmVkRGF0YSA8LSBjYmluZChxdWludGl6ZWREYXRhMlssMToyXSwgY29tYmluZWREYXRhKQpoZWFkKGNvbWJpbmVkRGF0YSkKY2xlYW50aXNzdWVzPC1jb2xuYW1lcyhjb21iaW5lZERhdGEpCmNsZWFudGlzc3VlczwtIHNhcHBseShjbGVhbnRpc3N1ZXMsIEZVTj1mdW5jdGlvbihnKXsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTwtZ3N1YiggIigiLCAiLiIsIGcsIGZpeGVkID0gVFJVRSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE8LWdzdWIoICIpIiwgIi4iLCBhLCBmaXhlZCA9IFRSVUUpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhPC1nc3ViKCAiLSIsICIuIiwgYSwgZml4ZWQgPSBUUlVFKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTwtZ3N1YiggIi8iLCAiLiIsIGEsIGZpeGVkID0gVFJVRSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE8LWdzdWIoICIuLiIsICIuIiwgYSwgZml4ZWQgPSBUUlVFKTsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTwtZ3N1YigiLi4iLCAiLiIsIGEsIGZpeGVkID0gVFJVRSk7IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE8LWdzdWIoIi5fIiwgIl8iLCBhLCBmaXhlZCA9IFRSVUUpOyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oYSkgfSApCiMoZGF0YV9sb25nWzQzOjQ4LCJUaXNzdWUiXSkKKHVuaXF1ZShjbGVhbnRpc3N1ZXMpWzQzOjQ4XSkKY29sbmFtZXMoY29tYmluZWREYXRhKTwtY2xlYW50aXNzdWVzCmhlYWQoY29tYmluZWREYXRhKQoKIyMgUmVtb3ZlIFRpc3N1ZXM6CmRpbShjb21iaW5lZERhdGEpCnJtVGlzc3VlcyA8LSB1bmxpc3QocmVhZC50YWJsZShmaWxlUmVtVGlzc3VlcywgaGVhZGVyID0gRiwgc2VwID0gIlx0IikpCm48LSJsb3dlci5hYmRvbWluYWwucGVsdmljLm90aGVyLnBsZWFzZS5zcGVjaWZ5X3NhcmNvbWEiCnJtTGlzdDwtIHNhcHBseShjb2xuYW1lcyhjb21iaW5lZERhdGEpLCBGVU49ZnVuY3Rpb24obil7IGw8LXVubGlzdChzdHJzcGxpdChuLCAiXyIpKTsgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsPC0gYyhsICVpbiUgcm1UaXNzdWVzLCBsPT0iTkEiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oc3VtKGwpPjApICB9KSAKc3VtKHJtTGlzdCkKY29tYmluZWREYXRhPC0gY29tYmluZWREYXRhWywhcm1MaXN0XQpkaW0oY29tYmluZWREYXRhKQoKYGBgCgoKIyMjIEVuc3VyZSB0aGUgdGVybXMgYXJlIHN0YW5kYXJkaXplZApFbnN1cmUgdGhhdCBhbGwgdGhlIGdyb3VwIG5hbWVzIGFwcGVhciBpbiB0aGUgb250b2xvZ3kgb3IgdGhlIGNvcnJlY3Rpb25zIGZpbGUuCgpHZXQgdGhlIG9udG9sb2d5IGFuZCBjb3JyZWN0aW9uIGZpbGVzCgpgYGB7cn0Kb250IDwtIHJlYWQudGFibGUoZmlsZU9udG9sb2d5LCBoZWFkZXIgPSBGLCBzZXAgPSAiXHQiKQpjb3JyIDwtIHJlYWQudGFibGUoZmlsZUNvcnJlY3Rpb25zLCBoZWFkZXIgPSBULCBzZXAgPSAiXHQiKQpgYGAKCkFpbSB0byBoYXZlIDAgYXMgYSByZXN1bHQsIG1lYW5pbmcgYWxsIHRlcm1zIGFyZSBlaXRoZXIgYWxyZWFkeSBpbiB0aGUgb250b2xvZ3kgb3IgdGhlIGNvcnJlY3Rpb24gZmlsZS4gT3IgZWxzZTogdXBkYXRlIGNvcnJlY3Rpb24gZmlsZSBvciBvbnRvbG9neSBmaWxlLCBvciBib3RoLgoKYGBge3J9CiAgdHJtcyA8LSB1bmlxdWUodW5saXN0KHN0cnNwbGl0KG5hbWVzKGNvbWJpbmVkRGF0YSlbMzpuY29sKGNvbWJpbmVkRGF0YSldLCAiXyIpKSkgIyBTcGxpdHMgdGhlIGNvbXBvc2l0ZSB0ZXJtcyB0aGF0IGNvbnRhaW4gYm90aCB0aXNzdWUrZGlzZWFzZQogIGlmIChsZW5ndGgod2hpY2godHJtcyAlaW4lIHVuaW9uKGNvcnJbLDFdLCB1bmlxdWUodW5saXN0KG9udFssYygxLDMpXSkpKSkpICE9IDApewogICAgdHJtc1std2hpY2godHJtcyAlaW4lIHVuaW9uKGNvcnJbLDFdLCB1bmlxdWUodW5saXN0KG9udFssYygxLDMpXSkpKSldICMgV2hpY2ggdGVybXMgYXJlbid0IGluIHRoZSBvbnRvbG9neSBvciB0aGUgY29ycmVjdGVkIHRlcm1zCiAgfSBlbHNlIHsKICAgIHRybXMKICB9CmBgYApDb3JyZWN0IGN1cnJlbnQgdGVybXMgdGhhdCBuZWVkIHRvIGJlIGNvcnJlY3RlZC4KYGBge3J9CmNvbG5hbWVzKGNvbWJpbmVkRGF0YSkgPC0gc2FwcGx5KGNvbG5hbWVzKGNvbWJpbmVkRGF0YSksIGZ1bmN0aW9uKHopIHsKICB5IDwtIHN0cnNwbGl0KHosICJfIilbWzFdXQogIHJldFZhbCA8LSBzYXBwbHkoeSwgZnVuY3Rpb24oeCkgewogICAgaWYgKHggJWluJSBjb3JyJGN1cnJlbnRUZXJtKSB7CiAgICAgIHJldHVybihjb3JyJGNvcnJlY3RlZFRlcm1bbWF0Y2goeCwgY29yciRjdXJyZW50VGVybSldKQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuKHgpCiAgICB9CiAgfSkKICByZXR1cm4ocGFzdGUocmV0VmFsLCBjb2xsYXBzZSA9ICJfIikpCn0pCmBgYAoKIyMjIENvbnZlcnQgdG8gbG9uZyBmb3JtYXQKQWRkIHRoZSBDYW5vbmljYWwgY29sdW1uIGFuZCBTb3VyY2UgY29sdW1uCgpgYGB7cn0KZGF0YSA8LSBjb21iaW5lZERhdGEgIyBhbGwgdGlzc3VlcyBoYXZlIHRvIGV4aXN0IGluIG9udG9sb2d5IG9yIGNvcnJlY3Rpb24gZmlsZXMKZGF0YSRDYW5vbmljYWwgPC0gc2FwcGx5KGRhdGEkU2VxLCBmdW5jdGlvbih4KSBpZiAoeCAlaW4lIG1yYnNlJFNlcSkgcmV0dXJuKFQpIGVsc2UgcmV0dXJuKEYpKQpkYXRhJFNvdXJjZSA8LSAiVENHQSIKZGF0YSA8LSBkYXRhWyxjKDEsMixuY29sKGRhdGEpLTEsbmNvbChkYXRhKSwzOihuY29sKGRhdGEpLTIpKV0gIyBTZXQgY29sdW1ucyBhbGlnbm1lbnQKaGVhZChkYXRhKQpgYGAKCgpDb252ZXJ0IHRvIGxvbmcgZm9ybWF0CgpgYGB7cn0KZGF0YV9sb25nIDwtIG1lbHQoZGF0YSwgaWQudmFycz1jKCJOYW1lIiwgIlNlcSIsICJDYW5vbmljYWwiLCAiU291cmNlIikpCmBgYAoKQmluYXJpemF0aW9uCmBgYHtyfQpkYXRhX2xvbmckQmluYXJ5IDwtIHNhcHBseShkYXRhX2xvbmckdmFsdWUsIGZ1bmN0aW9uKHgpIGlmICh4ID09IDApIHJldHVybigwKSBlbHNlIHJldHVybigxKSkKbmFtZXMoZGF0YV9sb25nKSA8LSBjKCJtaVIiLCAiU2VxIiwgIkNhbm9uaWNhbCIsICJTb3VyY2UiLCAiVGlzc3VlIiwgIlNjYWxlIiwgIkJpbmFyeSIpCgoKCgpgYGAKCgojIyMgV3JpdGUgdG8gZmlsZQoKYGBge3J9CndyaXRlLnRhYmxlKGRhdGFfbG9uZywgIi4vdGNnYV9sb25nRGF0YS50eHQiLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSBGLCBjb2wubmFtZXMgPSBULCBxdW90ZSA9IEYpCndyaXRlLnRhYmxlKHVuaXF1ZShkYXRhX2xvbmdbLDE6M10pLCAiLi90Y2dhX21pUk5Bcy50eHQiLCBzZXAgPSAiXHQiLCByb3cubmFtZXMgPSBGLCBjb2wubmFtZXMgPSBULCBxdW90ZSA9IEYpCndyaXRlTGluZXMoYXMuY2hhcmFjdGVyKHVuaXF1ZShkYXRhX2xvbmckVGlzc3VlKSksICIuL3RjZ2FfdGlzc3Vlcy50eHQiKQpgYGAK